#include "DSP2833x_Device.h"     
   

struct CPUTIMER_VARS CpuTimer0;

/* 
    CpuTimer 1 and CpuTimer2 are used by DSP BIOS & other RTOS. Comment out if using DSP BIOS or other 
    RTOS.
*/     
struct CPUTIMER_VARS CpuTimer1;
struct CPUTIMER_VARS CpuTimer2;

/*
---------------------------------------------------------------------------
 InitCpuTimers:
---------------------------------------------------------------------------
 This function initializes all three CPU timers to a known state.
 Timer0 for schedule routine
 Timer1 for AD sample
 Timer2 for phase-shift
*/
void InitCpuTimers(void)
{
    /* 
     CPU Timer 0
	 Initialize address pointers to respective timer registers:
	*/
	CpuTimer0.RegsAddr = &CpuTimer0Regs;
    
	/* Initialize timer period to maximum:*/
	CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;

    /* Initialize pre-scale counter to divide by 1 (SYSCLKOUT):*/
	CpuTimer0Regs.TPR.all  = 0;
	CpuTimer0Regs.TPRH.all = 0;

    /* Make sure timer is stopped: */
	CpuTimer0Regs.TCR.bit.TSS = 1;

    /* Reload all counter register with period value:*/
	CpuTimer0Regs.TCR.bit.TRB = 1;

    /* Reset interrupt counters: */
	CpuTimer0.InterruptCount = 0;


    /* Enable the interrupt of timer0 of PIE level */
    PieCtrlRegs.PIEIER1.bit.INTx7 = DEF_ENABLE;
    

    /*-------- Initialize the Timer1 and Timer2 --------*/
	CpuTimer1.RegsAddr = &CpuTimer1Regs;
	CpuTimer2.RegsAddr = &CpuTimer2Regs;
    
	/* Initialize timer period to maximum: */
	CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;
	CpuTimer2Regs.PRD.all  = 0xFFFFFFFF;
    
    /* Initialize pre-scale counter to divide by 1 (SYSCLKOUT):*/
	CpuTimer1Regs.TPR.all  = 0;
	CpuTimer1Regs.TPRH.all = 0;
	CpuTimer2Regs.TPR.all  = 0;
	CpuTimer2Regs.TPRH.all = 0;
    
    /* Make sure timers are stopped:*/
	CpuTimer1Regs.TCR.bit.TSS = 1;
	CpuTimer2Regs.TCR.bit.TSS = 1;
    
	/* Reload all counter register with period value: */
	CpuTimer1Regs.TCR.bit.TRB = 1;
	CpuTimer2Regs.TCR.bit.TRB = 1;
    
	/* Reset interrupt counters: */
	CpuTimer1.InterruptCount = 0;
	CpuTimer2.InterruptCount = 0;


    /* Config the interval time of timer0 */
    ConfigCpuTimer(&CpuTimer0, 150, 1000000); 

    /* Config the interval time of timer1 */
    ConfigCpuTimer(&CpuTimer1, 150, 1000000); 

    /* Config the interval time of timer2 */
    ConfigCpuTimer(&CpuTimer2, 150, 1000000); 

    /* Install ISR of TIMER */
    EALLOW;  
    PieVectTable.XINT13 = &ISRTimer1;
    PieVectTable.TINT2   = &ISRTimer2;

    /* Install ISR of TIMER */
    PieVectTable.TINT0  = &ISRTimer0;
    EDIS;    


    /* Enable the interrupt of timer0 of CPU level(Group) */
    IER |= M_INT1;
    
    /* Enable the interrupt of timer1 of CPU level(Group) */
    IER |= M_INT13;

    /* Enable the interrupt of timer2 of CPU level(Group) */
    IER |= M_INT14;
}


/*
---------------------------------------------------------------------------
ConfigCpuTimer:
---------------------------------------------------------------------------
This function initializes the selected timer to the period specified
by the "Freq" and "Period" parameters. The "Freq" is entered as "MHz"
and the period in "uSeconds". The timer is held in the stopped state
after configuration.
*/
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
	Uint32 	temp = 0;


	/* Reset interrupt counter:*/
	Timer->InterruptCount = 0;

	/* Initialize timer period:*/
	Timer->CPUFreqInMHz = Freq;
	Timer->PeriodInUSec = Period;
	temp = (long) (Freq * Period);
	Timer->RegsAddr->PRD.all = temp;

	/* Set pre-scale counter to divide by 1 (SYSCLKOUT):*/
	Timer->RegsAddr->TPR.all  = 0;
	Timer->RegsAddr->TPRH.all  = 0;

	/* Initialize timer control register:*/
	Timer->RegsAddr->TCR.bit.TSS = 1;      /* 1 = Stop timer, 0 = Start/Restart Timer */
	Timer->RegsAddr->TCR.bit.TRB = 1;      /* 1 = reload timer */
	Timer->RegsAddr->TCR.bit.SOFT = 0;
	Timer->RegsAddr->TCR.bit.FREE = 0;     /* Timer Free Run Disabled */
	Timer->RegsAddr->TCR.bit.TIE = 1;      /* 0 = Disable/ 1 = Enable Timer Interrupt */

}
